#include <iostream>
using namespace std;

class Father{
    protected:
        string name;
        int age;
    public:
        Father(){}
        Father(string n, int a):name(n), age(a){}
        ~Father(){}
        // 在定义成员函数前加了关键字 virtual 那么这函数就是一个虚函数
        // 如果此处的show没有virtual修饰
        // 那么通过父类的指针或者引用只能访问父类的 show
        virtual void show(void){
            cout << "Father show : " << name << " " << age << endl;
        }
};

class Son:public Father{
    private:
        string toy;
    public:
        Son(){}
        Son(string n, int a, string t):Father(n, a), toy(t){}
        ~Son(){}
        // 子类重写了父类的虚函数
        void show(void){
            cout << "Son show : " << name << " " << age << " " << toy << endl;
        }
        void func(void){
            cout << "Son func" << endl;
        }
};

int main(int argc, const char *argv[]){
    Son s1("小明", 18, "蓝球");
    s1.show();  // 子类的show

    Father &r1 = s1;
    r1.show();  // 子类的show
    // r1.func(); // 无法调用非 子类中重写的父类的虚函数

    Father *p1 = new Son("小红", 20, "布娃娃");
    p1->show(); // 子类的show
    // p1->func(); // 无法调用非 子类中重写的父类的虚函数
    delete p1;

    Son &r2 = s1;
    r2.show();  // 子类的show

    Son *p2 = &s1;
    p2->show(); // 子类的show

    Father *p3 = new Father("小强", 19);
    p3->show(); // 父类的show

    return 0;
}